
/**
 *  @file
 *  Set Views Slideshow DDblock jQuery Cycle plugin functionality 
 */
 
(function ($) {
  Drupal.behaviors.viewsSlideshowDdblockCycle = {
    attach: function (context) {



      //helper function to clone the options object
      function CloneObject(inObj) {
        for (i in inObj)
        {
            this[i] = inObj[i];
        }
      }

      // cycle Plugin onBefore function to add functionality before the next slide shows up
      // can be used to add the following effects to slide-text
      // fadeOut - Fade out all matched elements by adjusting their opacity and firing an optional callback after completion.
      // slideUp - Hide all matched elements by adjusting their height and firing an optional callback after completion.
      // hide - Hide all matched elements using a graceful animation and firing an optional callback after completion.
      
      // Todo: create variables for 
      // $("#views-slideshow-ddblock-" + opts.ddblocknr + ' ' + opts.slideTextContainer + '-' + opts.slideTextPosition)
      function onBefore(curr, next, opts, fwd) {
        if (opts.slideTextjQuery == 1){
          if (opts.slideTextEffectBeforeSpeed == 0) {
            opts.slideTextEffectBeforeSpeed = 1;
          };
          switch (opts.slideTextEffectBefore) {
          case "fadeOut":
            $("#views-slideshow-ddblock-"+ opts.ddblocknr + ' ' + opts.slideTextContainer + '-' + opts.slideTextPosition)
            .stop(true,true)
            .fadeOut(opts.slideTextEffectBeforeSpeed);
          break;
          case "slideUp":
            $("#views-slideshow-ddblock-"+ opts.ddblocknr + ' ' + opts.slideTextContainer + '-' + opts.slideTextPosition)
            .stop(true,true)
            .slideUp(opts.slideTextEffectBeforeSpeed);
          break;
          default:
            $("#views-slideshow-ddblock-"+ opts.ddblocknr + ' ' + opts.slideTextContainer + '-' + opts.slideTextPosition)
            .stop(true,true)
            .hide(opts.slideTextEffectBeforeSpeed);
          }
        }  
      }

      // cycle Plugin onAfter function to add functionality after the next slide shows up
      // can be used to add the following effects to slide-text
      // fadein - Fade in all matched elements by adjusting their opacity and firing an optional callback after completion.
      // slideDown - Reveal all matched elements by adjusting their height and firing an optional callback after completion.
      // show - Show all matched elements using a graceful animation and firing an optional callback after completion.
      
      // Todo: create variables for 
      // $("#views-slideshow-ddblock-" + opts.ddblocknr + ' ' + opts.slideTextContainer + '-' + opts.slideTextPosition)
      // and $("#views-slideshow-ddblock-" + opts.ddblocknr + ' div.slide-' + opts.nextSlide + ' ' + opts.slideTextContainer + '-' + opts.slideTextPosition)
      function onAfter(curr, next, opts, fwd) {
        if (opts.slideTextjQuery == 1){
          if (opts.slideTextEffectAfterSpeed == 0) {
            opts.slideTextEffectAfterSpeed = 1;
          };
          switch (opts.slideTextEffectAfter) {
          case "fadeIn":
           $("#views-slideshow-ddblock-" + opts.ddblocknr + ' ' + opts.slideTextContainer + '-' + opts.slideTextPosition)
           .fadeIn(opts.slideTextEffectAfterSpeed);
           $("#views-slideshow-ddblock-" + opts.ddblocknr + ' div.slide-' + opts.nextSlide + ' ' + opts.slideTextContainer + '-' + opts.slideTextPosition).css({"display":"none"});
          break;
          case 'slideDown':
           $("#views-slideshow-ddblock-" + opts.ddblocknr + ' ' + opts.slideTextContainer + '-' + opts.slideTextPosition)
           .slideDown(opts.slideTextEffectAfterSpeed);
           $("#views-slideshow-ddblock-" + opts.ddblocknr + ' div.slide-' + opts.nextSlide + ' ' + opts.slideTextContainer + '-' + opts.slideTextPosition).css({"display":"none"});
          break;
          default:
           $("#views-slideshow-ddblock-" + opts.ddblocknr + ' ' + opts.slideTextContainer + '-' + opts.slideTextPosition)
           .show(opts.slideTextEffectAfterSpeed);
           $("#views-slideshow-ddblock-" + opts.ddblocknr + ' div.slide-' + opts.nextSlide + ' ' + opts.slideTextContainer + '-' + opts.slideTextPosition).css({"display":"none"});
          }
        }  

        // stop slideshow when video is started used with flowplayer
        //$f(opts.currSlide).onStart(function() { 
          //alert('stop slideshow ('+opts.currSlide+')');
        //  $container.cycle('pause');
        //});

        //when scrollable pager is used set active pager-item to current slide
        if (opts.pager1 == 'scrollable-pager' ){
          opts.myScrollable.click(opts.currSlide);
        }

        // show pager count (0 of x)
        $("#views-slideshow-ddblock-"+ opts.ddblocknr + ' ' + 'a.count').html((opts.currSlide + 1) + " " + Drupal.t("of") + " " + opts.slideCount);

        // For prev/next pager in the pager. Only show prev if previous slide exist - Only show next if next slide exist
        var index = $(this).parent().children().index(this);
        if (opts.pager2PagerHide == 1) {
          $("#views-slideshow-ddblock-"+ opts.ddblocknr + ' li.pager-prev ' + 'a.prev')[index == 0 ? 'hide' : 'show']();
          $("#views-slideshow-ddblock-"+ opts.ddblocknr + ' li.pager-next ' + 'a.next')[index == opts.slideCount - 1 ? 'hide' : 'show']();
        }

        // For prev/next pager in the slides. Only show prev if previous slide exist - Only show next if next slide exist
        var index = $(this).parent().children().index(this);
        if (opts.pager2SlideHide == 1) {
          $("#views-slideshow-ddblock-"+ opts.ddblocknr + ' div.prev-container ' + 'a.prev')[index == 0 ? 'hide' : 'show']();
          $("#views-slideshow-ddblock-"+ opts.ddblocknr + ' div.next-container ' + 'a.next')[index == opts.slideCount - 1 ? 'hide' : 'show']();
        }
      }

      i=0;
      for (var base in Drupal.settings.viewsSlideshowDdblockContent) {
        // new options var for every block
        var options = new CloneObject($.fn.cycle.defaults);

        // simplify variable name
        var ViewsSlideshowDdblockSettings = Drupal.settings.viewsSlideshowDdblockContent[base];
        var block = ViewsSlideshowDdblockSettings.block;
        //alert(ViewsSlideshowDdblockSettings.nrOfItems);
        var custom = ViewsSlideshowDdblockSettings.custom;
        var pager = ViewsSlideshowDdblockSettings.pager;
        //alert(base);
        var pager2 = ViewsSlideshowDdblockSettings.pager2;
        var contentContainer = ViewsSlideshowDdblockSettings.contentContainer;
        var pagerContainer = ViewsSlideshowDdblockSettings.pagerContainer;

        // if not processed
        if (!$('#views-slideshow-ddblock-' + block + '.ddblock-processed', context).size()) {

          // set transition option
          options.fx = ViewsSlideshowDdblockSettings.fx;

          //set delay option for the blocks at different values so they less interfere with eachother
          options.delay = i * -1000;

          // set pager. You can have only one pager per block this way
          if (pager == 'image-pager' || pager == 'number-pager' || pager == 'custom-pager' || pager == 'scrollable-pager') {
            // number pager, image pager and custom pager and scrollable pager
            options.pager = "#views-slideshow-ddblock-" + pager + "-" + block;
            //store pager1 
            options.pager1 = pager;
            if (pager == 'number-pager') {
              options.pagerAnchorBuilder = function(idx, slide) {
                // return selector string for existing anchor
                return "#views-slideshow-ddblock-" + pager + "-" + block + " li.number-pager-item:eq(" + idx + ") a.pager-link";
              }
            }
            if (pager == 'image-pager') {
              options.pagerAnchorBuilder = function(idx, slide) {
                // return selector string for existing anchor
                return "#views-slideshow-ddblock-" + pager + "-" + block + " li.image-pager-item:eq(" + idx + ") a.pager-link";
              }
            }
            if (pager == 'custom-pager') {
              options.pagerAnchorBuilder = function(idx, slide) {
                // return selector string for existing anchor
                return "#views-slideshow-ddblock-" + pager + "-" + block + " " 
                + pagerContainer + ":eq(" + idx + ") a.pager-link";
              }
            }
            if (pager == 'scrollable-pager') {
              options.pagerAnchorBuilder = function(idx, slide) {
                // return selector string for existing anchor
                return "#views-slideshow-ddblock-" + pager + "-" + block + " " 
                + pagerContainer + ":eq(" + idx + ") a.pager-link";
              }
            }
          }

          //set event which drives the pager navigation
          options.pagerEvent = ViewsSlideshowDdblockSettings.pagerEvent;
          options.prevNextEvent = ViewsSlideshowDdblockSettings.pager2Event;

          // If pager fast set use fastOnEvent pager
          options.fastOnEvent = (ViewsSlideshowDdblockSettings.pagerFast == 1) ? 1 : 0;

          // pause slideshow on pager hover
          options.pauseOnPagerHover = (ViewsSlideshowDdblockSettings.pagerPause == 1) ? 1 : 0;

          // disable click if pager is mouseover
          if (ViewsSlideshowDdblockSettings.pagerEvent == 'mouseover') {
            if (ViewsSlideshowDdblockSettings.pagerDisableClick == 1) {
              $("#views-slideshow-ddblock-" + pager + "-" + ViewsSlideshowDdblockSettings.block + " a.pager-link").click(function() {
                return false;
              });
            }
            else {
              $("#views-slideshow-ddblock-" + pager + "-" + ViewsSlideshowDdblockSettings.block + " a.pager-link").click(function() {
                location.href = this.href;
              });
            }
          }
          // disable click if prev/next pager is mouseover
          if (ViewsSlideshowDdblockSettings.pager2Event == 'mouseover') {
              $("#views-slideshow-ddblock-"+ ViewsSlideshowDdblockSettings.block + ' a.prev').click(function() {
                return false;
              });
              $("#views-slideshow-ddblock-"+ ViewsSlideshowDdblockSettings.block + ' a.next').click(function() {
                return false;
              });
          }

          //add prev next pager
          if (pager2 == 1) {
            options.prev = "#views-slideshow-ddblock-"+ ViewsSlideshowDdblockSettings.block + ' a.prev';
            options.next = "#views-slideshow-ddblock-"+ ViewsSlideshowDdblockSettings.block + ' a.next';
          } 
          else {
            //set next
            if (ViewsSlideshowDdblockSettings.next) {
                options.next = "#views-slideshow-ddblock-"+ ViewsSlideshowDdblockSettings.block + ' ' + contentContainer;
            }
          }

          //set expression for selecting slides (if something other than all children is required)
          options.slideExpr = contentContainer;

          //set speed of the transition (any valid fx speed value)
          options.speed = ViewsSlideshowDdblockSettings.speed;
          if (options.speed == 0) {
            options.speed = 1;
          };

          //set timeout in milliseconds between slide transitions (0 to disable auto advance)
          options.timeout = ViewsSlideshowDdblockSettings.timeOut;

          //set pause, true to enable "pause on hover"
          if (ViewsSlideshowDdblockSettings.pause) {
            options.pause = ViewsSlideshowDdblockSettings.pause;
          }

          //set custom options
          if (custom) {
            // get the \r\n from the string
            var custom1 = custom.replace(/\r\n/gi,"");

            // parse into JSON object
            var custom2 = JSON.parse(JSON.stringify(custom1));

            // merge custom2 with options object
            jQuery.extend(true, options, custom2);
          }

          // redefine Cycle's updateActivePagerLink function
          $.fn.cycle.updateActivePagerLink = function(pager, currSlide) {
            $(pager)
              .find('a.pager-link')
              .removeClass('activeSlide')
              .filter('a.pager-link:eq('+currSlide+')')
              .addClass('activeSlide');
            $(pager)
              .find('.custom-pager-item')
              .removeClass('active-pager-item')
              .filter('.custom-pager-item:eq('+currSlide+')')
              .addClass('active-pager-item');
            $(pager)
              .find('.scrollable-pager-item')
              .removeClass('active-pager-item')
              .filter('.scrollable-pager-item:eq('+currSlide+')')
              .addClass('active-pager-item');
          };

          options.pager2PagerHide = ViewsSlideshowDdblockSettings.pager2PagerHide;
          options.pager2SlideHide = ViewsSlideshowDdblockSettings.pager2SlideHide;
          options.ddblocknr = block;
          options.before = onBefore;
          options.after = onAfter;

          if (ViewsSlideshowDdblockSettings.slideText == 1) {
            //set slidetext options
            options.slideTextContainer = ViewsSlideshowDdblockSettings.slideTextContainer;
            options.slideTextPosition = ViewsSlideshowDdblockSettings.slideTextPosition;
            options.slideTextEffectBefore = ViewsSlideshowDdblockSettings.slideTextEffectBefore;
            options.slideTextEffectBeforeSpeed = ViewsSlideshowDdblockSettings.slideTextEffectBeforeSpeed;
            options.slideTextEffectAfter = ViewsSlideshowDdblockSettings.slideTextEffectAfter;
            options.slideTextEffectAfterSpeed = ViewsSlideshowDdblockSettings.slideTextEffectAfterSpeed;
            options.slideTextjQuery = ViewsSlideshowDdblockSettings.slideTextjQuery;
          }

          options.pagerContainer = ViewsSlideshowDdblockSettings.pagerContainer;

          if (pager == 'scrollable-pager') {
            // set scrollableVertical to true when pager at left of right right, otherwise the scrollableVertical to false
            if (ViewsSlideshowDdblockSettings.pagerPosition == 'left' || ViewsSlideshowDdblockSettings.pagerPosition == 'right') {
              scrollableVertical = true;
            } 
            else {
              scrollableVertical = false;
            }
            // create one scrollable element and return the API by enabling the "api" property
            var myScrollable = $('#views-slideshow-ddblock-scrollable-pager-' + 
                                  block + 
                                  ' div.vsd-scrollable-pager').scrollable({ 

              // number of items vissible in scrollable pager 
              size: ViewsSlideshowDdblockSettings.nrOfPagerItems,

              //vertical slideshow
              vertical:scrollableVertical,

              //nextitem navigation, default used
              //next: '.next',

              //previtem navigation, default used
              //prev: '.prev',

              //enable api property
              api:true

            });
            //activate slide 1
            myScrollable.click(0);

            //set scrollable pager option
            options.myScrollable = myScrollable;
          }

          //start with slidenr from URL
          function getUrlVars() {
            var vars = [], hash;
            var hashes = window.location.href.slice(window.location.href.indexOf('?') + 1).split('&');
            for(var i = 0; i < hashes.length; i++) {
              hash = hashes[i].split('=');
              vars.push(hash[0]);
              vars[hash[0]] = hash[1];
            }
            return vars;
          }  

          var startThisSlide = getUrlVars()["slidenum"];
          if (startThisSlide > 0 ){
            options.startingSlide = startThisSlide;
          }

          //Use the parent of the slides as the parent container so the children function can be used for the second pager
          if (ViewsSlideshowDdblockSettings.nrOfItems == 1) {
            var $container = $('#views-slideshow-ddblock-' + block + ' ' + contentContainer).parent();
            $container
            .css('visibility', 'visible')
            .addClass('ddblock-processed');
            $(contentContainer, $container).css('display', 'block');
            var $slideshowContainer = $('#views-slideshow-ddblock-' + block);
            //hide the pager
            $('div.views-slideshow-ddblock-pager', $slideshowContainer).css('display', 'none');
            //hide the pager on the slide
            $('div.views-slideshow-ddblock-prev-next-slide', $slideshowContainer).css('display', 'none');
          }

          else {
            var $container = $('#views-slideshow-ddblock-' + block + ' ' + contentContainer).parent();
            $container
            .cycle(options)
            .css('visibility', 'visible')
            .addClass('ddblock-processed');

            // stop slideshow when hover on scrollable pager container
            if (pager == 'scrollable-pager') {
              if (ViewsSlideshowDdblockSettings.pagerPause == 1) {
                $('#views-slideshow-ddblock-' + block + ' .scrollable-pager').hover(
                  function() {
                    $container.cycle('pause');
                  },
                  function() {
                    $container.cycle('resume');
                  }
                );
              }
            }
          }
        }
      }
      
      
    }
  };
})(jQuery);


